package doc

import (
	"strings"
)

type Api struct {
	Apis  []*Group               `json:"apis" ego:"api 列表"`
	Args  map[string]*ObjectInfo `json:"args" ego:"请求参数（自定义结构）字典"`
	Infos map[string]*ObjectInfo `json:"infos" ego:"返回（自定义结构）字典"`
}

// ObjectInfo 输入、输出数据信息描述
type ObjectInfo struct {
	ID               string        `json:"id,omitempty"`
	ReferenceID      string        `json:"reference,omitempty"` // 指向其它 ObjectInfo.ID，原生数据类型为空
	Name             string        `json:"name"`
	Type             string        `json:"type"`
	KeyType          string        `json:"keyType,omitempty"`
	JsonTypeIsString bool          `json:"jsonTypeIsString,omitempty"`
	TimeFormat       string        `json:"timeFormat,omitempty"`
	Require          bool          `json:"require,omitempty"` // TODO 递归引用时，需要处理截断 Require 链
	Range            string        `json:"range,omitempty"`   // 取值范围
	Array            bool          `json:"array,omitempty"`   // 是否是数组
	Description      string        `json:"description,omitempty"`
	Children         []*ObjectInfo `json:"children,omitempty"`
}

type Group struct {
	Name       string     `json:"name" ego:"API 分组名称"`
	Deprecated bool       `json:"deprecated" ego:"弃用"`
	Desc       string     `json:"desc" ego:"API 分组说明"`
	Services   []*Service `json:"services" ego:"API 列表"`
}

func (a *Group) String() string {
	return a.Name
}

type Service struct {
	Name           string      `json:"name" ego:"API 名称"`
	Deprecated     bool        `json:"deprecated" ego:"弃用"`
	Desc           string      `json:"desc" ego:"API 说明"`
	ArgIsRequire   bool        `json:"argIsRequired" ego:"该请求参数不能是空"`
	Upload         bool        `json:"upload" ego:"该 API 是上传文件的接口"`
	WebSocket      bool        `json:"webSocket" ego:"该 API 是 websocket 接口"`
	ResponseBinary bool        `json:"responseBinary" ego:"返回二进制数据"`
	Arg            *ObjectInfo `json:"arg" ego:"请求参数"`
	Info           *ObjectInfo `json:"info" ego:"反馈信息"`
}

func (a *Service) String() string {
	return a.Name
}

type name interface {
	String() string
}

type Sorter[T name] []T

func (s Sorter[T]) Len() int {
	return len(s)
}

func (s Sorter[T]) Less(i, j int) bool {
	return strings.Compare(s[i].String(), s[j].String()) > 0
}

func (s Sorter[T]) Swap(i, j int) {
	s[i], s[j] = s[j], s[i]
}
